/************************************************************************
** 文  件：
**	DbMySql.h
** 功  能：
**	提供MySQL数据库操作接口封装
** 作  者：
**	email:lixx2048@163.com
**  wechat:lixiang6153
**  QQ:941415509
** 日  期：
**	2020/10/15	14:00:00
** 说  明：
**	无
** 版  本：
**	2020/10/15	14:00:00		1.0		lixx2048@163.com
/************************************************************************/
#pragma once
#include <string.h>
#include "IDbBase.h"
#include "mysql.h"
#include "errmsg.h"

// mysql接口返回值
enum MYSQL_ERROR
{
	RET_SUCCESS = 0,   // 操作成功
	RET_INIT_FAIL = -1,   // 初始化数据库失败
	RET_OPEN_FAIL = -2,   // 打开数据库失败
	RET_UNOPEN_DB = -3,   // 未打开数据库
	RET_INSERT_FAIL = -4,   // 插入失败
	RET_DELETE_FAIL = -5,   // 删除失败
	RET_UPDATE_FAIL = -6,   // 更新失败
	RET_CLOSE_FAIL = -7,   // 关闭数据库失败
	RET_FIND_FAIL = -8,   // 查询失败
	RET_MAINKEY_VALUE_EXIST = -9,   // 主键（ID）值已经存在<相同的主键值>
	RET_FREE_FAIL = -10,  // 释放错误
	RET_GETDATA_FAIL = -11,  // 获取不到行数据
	RET_MAXVALUE_FAIL = -12,  // 某字段最大值的行数据错误
	RET_GET_NUM_ROW_FAIL = -13   // 获取行数错误
};

class CDbMySql : public IDbBase
{
public:
	CDbMySql(void);
	virtual ~CDbMySql(void);

public:
	virtual bool Open(const char* ip, int port, const char* user, const char* pwd, const char* name);
	virtual void Close(void);
	virtual bool IsTableExist(const char* tbname);
	virtual bool CreateTable(const char* sql);
	virtual bool Exec(const char* sql);
	virtual bool IsProcedureExist(const char* dbname, const char* procname);
	virtual bool CreateProcedure(const char* sql);
	virtual uint64_t Insert(const char* sql);
	virtual bool Delete(const char* sql);
	virtual bool Update(const char* sql);
	virtual bool Query(const char* sql);
	virtual void FreeQueryResult(void);
	virtual bool FetchNextRow(void);
	virtual long GetRowCount();
	virtual int  GetColCount();
	virtual char* GetColValue(int nCol);
	virtual const char* GetErrorMessage();

protected:
	void KeepAlive();
	bool _Exec(const char* sql);

private:
	MYSQL* m_Mysql;
	MYSQL_RES* m_pResult;
	MYSQL_ROW       m_ppRecord;
	bool			m_stop;
	std::thread	    m_thread;
};